#include <stdio.h>
#include <stdlib.h>
#include "ppm.h"
#include "io.h"
#include "dinamico.h"

void CalculaCostura(Imagem *original, Imagem *reduzida, int **accum, int **source, int numLinhas, int numColunas)
{
	int x, y, x1, x2;
	int seamX = 0;
	float min_value = 100000000.0f;
	for(x=0; x<numColunas; x++)
	{
		if(accum[numLinhas-1][x] < min_value)
		{
			seamX = x;
			min_value = accum[numLinhas-1][x];
		}
	}

	for(y=numLinhas-1; y>=0; y--)
	{
		x1 = 0;		//x-directional coordinate for source
		x2 = 0;		//x-directional coordinate for target
		while(x1 < numColunas)
		{
			if(x1 != seamX)
			{
				//tmp[y][x2] = data[y][x1];
				reduzida->imagem[y][x2].pixelBLUE = original->imagem[y][x1].pixelBLUE;
				reduzida->imagem[y][x2].pixelRED = original->imagem[y][x1].pixelRED;
				reduzida->imagem[y][x2].pixelGREEN = original->imagem[y][x1].pixelGREEN;
				reduzida->imagem[y][x2].energia = original->imagem[y][x1].energia;

				x2++;
			}

			x1++;
		}
		x2 = 0;
		seamX = source[y][seamX];
	}
}

void SeamCarvingDinamico(Imagem *original, Imagem *reduzida, int numLinhas, int numColunas)
{
	int x, y, d; //variáveis Loop
	int from;
	double delta;
	double min_value;
	int **accum = AlocaMatrizInt(numLinhas, numColunas);	//accumulative energy
	int **source = AlocaMatrizInt(numLinhas, numColunas);		//store previous pixel on the seam

	for(x=0; x<numColunas; x++)
	{
		accum[0][x] = original->imagem[0][x].energia;
		source[0][x] = 0;
	}

	for(y=1; y<numLinhas; y++)
	{
		for(x=0; x<numColunas; x++)
		{
			min_value = 100000000.0f;
			from = 0;
			for(d=-1; d<=1; d++)
			{
				if(x+d >= 0 && x+d < numColunas)
				{
					delta = original->imagem[y-1][x+d].energia;
					if(delta < min_value)
					{
						min_value = delta;
						from = x+d;
					}
				}
			}

			accum[y][x] = original->imagem[y][x].energia + min_value;
			source[y][x] = from;
		}
	}

	CalculaCostura(original, reduzida, accum, source, numLinhas, numColunas);
//	ImprimeMatrizInt(accum, numLinhas, numColunas);
//	printf("\n");
//	ImprimeMatrizEnergia(reduzida, numLinhas, numColunas-1);
//	printf("\n");
//	int i, j;
//	for(i=0; i<numLinhas; i++)
//	{
//		for(j=0; j<numColunas; j++)
//		{
//			printf("%d ", source[i][j]);
//		}
//		printf("\n");
//	}
}

